package com.fancy;

/**
 * @author chaigq
 * @version 1.0
 * @date 2021/5/19 11:30 下午
 */
public class VirtualColumn {

    // TODO 虚拟机启动参数
    // -XX:NewSize=5242880 -XX:MaxNewSize=5242880
    // -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760
    // -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=10485760
    // -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

    // “-XX:InitialHeapSize”和“-XX:MaxHeapSize”就是初始堆⼤⼩和最⼤堆⼤⼩，
    // “-XX:NewSize”和“-XX:MaxNewSize”是初始新⽣代⼤⼩和最⼤新⽣代⼤⼩
    // “-XX:PretenureSizeThreshold=10485760”指定了⼤对象阈值是10MB。
    // 堆内存分配10MB内存空间，其中新⽣代是5MB内存空间，其中Eden区占4MB，每个Survivor区占0.5MB，⼤
    // 对象必须超过10MB才会直接进⼊⽼年代，年轻代使⽤ParNew垃圾回收器，⽼年代使⽤CMS垃圾回收器，

    // TODO JVM 打印日志
    // 1. -XX:+PrintGCDetils：打印详细的gc⽇志
    // 2. -XX:+PrintGCTimeStamps：这个参数可以打印出来每次GC发⽣的时间
    // 3. -Xloggc:gc.log：这个参数可以设置将gc⽇志写⼊⼀个磁盘⽂件

    // -XX:NewSize=5242880 -XX:MaxNewSize=5242880 -XX:InitialHeapSize=10485760
    // -XX:MaxHeapSize=10485760 -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC
    // -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

    // TODO 设置参数
    // -XX:NewSize=5242880 -XX:MaxNewSize=5242880 -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
    // TODO 默认参数，只给JVM虚拟机添加日志配置
    // CommandLine flags: -XX:InitialHeapSize=536870912 -XX:MaxHeapSize=8589934592 -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC

    public static void main(String[] args) {
        // 代码运⾏，就会在JVM的Eden区内放⼊⼀个1MB的对象，同时在main线程的虚拟机栈中会压⼊⼀个main()⽅
        // 法的栈帧，在main()⽅法的栈帧内部，会有⼀个“array1”变量，这个变量是指向堆内存Eden区的那个1MB的数组
        byte[] array1 = new byte[1024 * 1024];
        // 在堆内存的Eden区中创建第⼆个数组，并且让局部变量指向第⼆个数组，然后第⼀个数组就没⼈引⽤了
        // 第⼀个数组就成了没⼈引⽤的“垃圾对象”
        array1 = new byte[1024 * 1024];
        // 码在堆内存的Eden区内创建了第三个数组，同时让array1变量指向了第三个数组，
        // 此时前⾯两个数组都没有⼈引⽤了，就都成了垃圾对象
        array1 = new byte[1024 * 1024];
        // array1这个变量什么都不指向了，此时会导致之前创建的3个数组全部变成垃圾对象
        array1 = null;
        // 这个时候就会触发年轻代的Young GC
        // Eden区总共就4MB⼤⼩，⽽且⾥⾯已经放⼊了3个1MB的数组了，所以剩余空间只有1MB了，此时2MB的数组是放不下
        byte[] array2 = new byte[2 * 1024 * 1024];

    }


}
